package com.sanmubird.mywebframework.eventbus.core;

import java.util.HashMap;
import java.util.Map;

/**
 * RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上，通常生产者甚至都不知道这些消息传递传递到了哪些队列中，生产者只能将消息发送到交换机(exchange)。
 * 交换机工作的内容非常简单
 * 一方面它接收来自生产者的消息，另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。
 * 是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。
 */
public enum MqExchangeEnum {

    /**
     * 用于演示的直接类型交换机
     */
    DEMO_DIRECT_EXCHANGE("DEMO_DIRECT_EXCHANGE", "DEMO_DIRECT_EXCHANGE_QUEUE", MqExchangeTypeEnum.DIRECT),
    /**
     * 用于演示的延迟类型交换机
     */
    DEMO_DELAY_EXCHANGE("DEMO_DELAY_EXCHANGE", "DEMO_DELAY_EXCHANGE_QUEUE", MqExchangeTypeEnum.DELAY),
    /**
     * 默认的交换机
     */
    DEFAULT_EXCHANGE("DEFAULT_EXCHANGE", "DEFAULT_EXCHANGE_QUEUE", MqExchangeTypeEnum.DIRECT);

    MqExchangeEnum(String routingKey, String queueName, MqExchangeTypeEnum exchangeType) {
        this.routingKey = routingKey;
        this.queueName = queueName;
        this.exchangeType = exchangeType;
    }

    private final String routingKey;

    private final String queueName;

    private final MqExchangeTypeEnum exchangeType;

    public String getRoutingKey() {
        return routingKey;
    }

    public String getQueueName() {
        return queueName;
    }

    public MqExchangeTypeEnum getExchangeType() {
        return exchangeType;
    }

    public static final Map<String, MqExchangeEnum> mqRouterEumMap = new HashMap<>();

    static {
        for (MqExchangeEnum router : MqExchangeEnum.values()) {
            mqRouterEumMap.put(router.getRoutingKey(), router);
        }
    }

    public static MqExchangeEnum getRouterBy(String routingKey) {
        return mqRouterEumMap.get(routingKey);
    }

}
